package com.midea.freecolder;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @description：
 * @author: wangwl23
 * @create: 2021-07-09 11:06
 */
public class Concurrent {
    static volatile boolean a = true;
    static volatile int b = 0;
    static AtomicInteger c = new AtomicInteger(0);

    public static void main(String[] args) throws InterruptedException {
        /**
         * 测试可见性，一个线程写，一个线程读,volatile可以保证能读到写后的最新值
         * 当写一个volatile变量时，JVM会把该线程本地内存中的变量强制刷新到主内存中去；
         *这个写操作会导致其他线程中的volatile变量缓存无效
         * */

        new Thread(() -> {
            while(a){
                //睡一毫秒就会重新从主存中取变量a
                /*try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }*/
            }
        }).start();
        Thread.sleep(1000);
        a = false;
        System.out.println(a);

        //测试原子性，(可见性是原子性的前提)两个线程都是先读后写
        for (int i = 0; i < 100000 ; i++) {
            new Thread(() -> b++).start();
            new Thread(() -> b++).start();
        }
        Thread.sleep(1000);
        System.out.println(b);
        //AtomicInteger
        for (int i = 0; i < 100000 ; i++) {
            new Thread(() -> c.getAndAdd(1)).start();
            new Thread(() -> c.getAndAdd(1)).start();
        }
        Thread.sleep(1000);
        System.out.println(c);

    }
}
